require.config({
    baseUrl:"./",
    paths:{
        jq:"../libs/jquery",
        getGoods:"../modules/getGoods",
        cartRender:"../modules/cartRender",
        setLocal:"../modules/setLocal",
        resetLocal:"../modules/resetLocal"
    }
});
require(["jq","getGoods","cartRender","setLocal","resetLocal"],function(_,getGoods,render,setLocal,resetLocal){
    const url = "http://localhost:3000/api";
    const tbody = $("tbody")
    // 0.获取本地数据
    let goods = localStorage.getItem("goods") ? JSON.parse(localStorage.getItem("goods")) : [];
    // 1.获取服务器数据
    getGoods(url,res=>{
        res = JSON.parse(res).msg;
        // 3.比对渲染
        render(goods,res,tbody)
        // 6. 页面渲染完成之后，计算总数量
        $(".all_num").html(allNum(goods));
        // 7. 页面渲染完成之后，计算总价
        $(".all_price").html(allPrice(goods));
    })
    // 4.绑定各种事件，开始各种操作
    tbody.on("click",".delete",function(){
        const id = $(this).parent().attr("index")
        const num = $(this).val()-0
        const price = $(this).prev().children().last().children().html()
        $(this).parent().remove()
        // console.log(price);
        // console.log(id)
        // 删除操作同步到本地数据
        resetLocal(goods,id,function(i){
            goods.splice(i,1)
        })
                // 删除之后，计算总数量
                $(".all_num").html(allNum(goods));
                // 删除之后，计算总价
                $(".all_price").html(allPrice(goods));
    })
    tbody.on("input",".setNum",function(){
        const id = $(this).parent().parent().attr("index")
        const num = $(this).val()-0
        const price = $(this).parent().prev().html()
        console.log(price)
        // 修改操作同步到本地数据
        resetLocal(goods,id,function(i){
            goods[i].num = num
        })
        // 修改之后，计算总数量
        $(".all_num").html(allNum(goods));
        // 修改之后，计算总价
        $(".all_price").html(allPrice(goods));
    })
     // 单个选中事件
    tbody.on("change", ".che", function(){
        const id = $(this).parent().parent().attr("index");
        const flag = this.checked;
        console.log(flag)
        resetLocal(goods, id, function(i){
            goods[i].flag = Number(flag)
        })
        // 单个选中修改后，同步到全选
        $("#allCheck")[0].checked = allFlag(goods);
        // 修改之后，计算总数量
        $(".all_num").html(allNum(goods));
        // 修改之后，计算总价
        $(".all_price").html(allPrice(goods));
    })
    // 初始：单个选中同步到全选
    $("#allCheck")[0].checked = allFlag(goods);

    // 全选事件
    $("#allCheck").change(function(){
        // 全选同步到单个选中，修改本地数据
        goods.forEach(val=>{
            val.flag = Number(this.checked);
        })
        localStorage.setItem("goods", JSON.stringify(goods))
        // 全选同步到单个选中，修改DOM
        for(var i=0;i<$(".che").length;i++){
            $(".che")[i].checked = this.checked;
        }
        // 修改之后，计算总数量
        $("#allNum").html(allNum(goods));
    })

})
// 计算总数量
function allNum(goods){
    return goods.reduce((prev, val)=>{
        return prev + val.num
    }, 0)
}
// 计算总价
function allPrice(goods){
    var sum = 0;
    for(var i=0;i<goods.length;i++){
        sum += goods[i].price * goods[i].num;
        console.log(goods[i])
    }
    return sum;
}

// 作业：将计算总数量和计算总价封装成独立的模块，引入执行

// 计算总数量
function allNum(goods){
    return goods.reduce((prev, val)=>{
        return val.flag ? prev + val.num : prev;
    }, 0)
}


// 计算总价
// 计算总价
function allPrice(goods){
    return goods.reduce((prev, val)=>{
        return val.flag ? prev + val.num * val.price : prev;
    }, 0)
}

// 判断是否需要全选
function allFlag(goods){
    return goods.every(val=>val.flag)
}